package com.ycy.variable;

import com.ycy.BaseNoListenerTest;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.junit.Test;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 这个类通过 runtimeService 来设置 和 获取 变量
 * 测试 流程变量 和 任务变量的区别
 */
public class VariableDemo extends BaseNoListenerTest {

  @Test
  public void create() {
    Deployment deploy = repositoryService.createDeployment().addClasspathResource("variable/abcde.bpmn20.xml").deploy();
    System.out.println(deploy.getId());
    //设置流程变量
    HashMap<String, Object> map = new HashMap<>();
    //定义的人员列表4人
    String[] v = {"shareniu1", "shareniu2", "shareniu3", "shareniu4"};
    map.put("per", "60元/位置");
    map.put("money", "10000元");
    map.put("assigneeList", Arrays.asList(v));
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("abcdef", map);
    System.out.println("==> 流程实例启动 实例id :" + pi.getProcessInstanceId());
  }

  /**
   * 查看 流程实例中 的变量持有情况
   */
  @Test
  public void query() {
    String procInstId = "2504";
    List<Task> list = taskService.createTaskQuery().processInstanceId(procInstId).list();
    System.out.println(list.size());

    for (Task task : list) {
      System.out.println("==>" + task);

      //获取局部变量
      Map<String, Object> variables = runtimeService.getVariablesLocal(task.getExecutionId());
      System.out.println("local variables " + variables);

      /*
          1 能查询到所有变量 包括上面的局部变量
          2 flowable内置变量
         nrOfActiveInstances = 4
         nrOfCompletedInstances = 0 当前有多少个任务完成了
         loopCounter = 0 当前任务索引，从0开始
       */
      Map<String, Object> variables1 = runtimeService.getVariables(task.getExecutionId());
      System.out.println("variables " + variables1);


      //一下两个查询不到原因，说是
      //查看不到变量 不知道为什么？ 应该是获取变的话，不行通过查询api 来获取
      System.out.println(task.getProcessVariables());
      //查看不到 不知道为什么？
      System.out.println(task.getTaskLocalVariables());

    }

    // 获取 待办的 userTask
    List<Task> list1 = taskService.createTaskQuery().processInstanceId(procInstId).list();
    for (Task task : list1) {
      System.out.println(task);
    }
  }

  @Test
  public void queryProcessVariable() {
    // 通过Executorid获取变量
    Map<String, Object> variables = runtimeService.getVariables("4");
    System.out.println(variables);
  }

  @Test
  public void addVariables() {
    String procInstId = "2504";
    List<Task> list1 = taskService.createTaskQuery().processInstanceId(procInstId).list();
    for (Task task : list1) {
      System.out.println(task);
      // 为当前任务实例设置变量。如果是多实例,这里设置的变量对其他并行的实例可见。
      Map<String, String> map = new HashMap<>();
      String taskID = task.getId();
      map.put(taskID + "新增全局变量", "哈");
      map.put(taskID + "A变量", "哈");

      // 局部变量
      Map<String, String> localmap = new HashMap<>();
      localmap.put(taskID + "新增局部变量", "哈哈");
      //局部变量 和 流程变量 同名时，也没关系 因为变量是挂载不同的 Execution 下的。
      localmap.put(taskID + "A变量", taskID + "哈");

      //
      taskService.setVariables(taskID, map);
      taskService.setVariablesLocal(taskID, localmap);

//      runtimeService.setVariables(task.getExecutionId(),map);
//      runtimeService.setVariablesLocal(task.getExecutionId(),localmap);

    }
  }

  @Test
  public void pass() {
    String procInstId = "4";
    List<Task> list1 = taskService.createTaskQuery().processInstanceId(procInstId).list();


    for (Task task : list1) {
      String id = task.getId();
      Map<String, Object> map = new HashMap<>();
      String[] v = {"A", "B", "C", "D"};
      map.put("assigneeListForc", Arrays.asList(v));
      map.put("comment", id + "通过");

      HashMap<String, Object> transientVariables = new HashMap<>();
      taskService.complete(id, map, transientVariables);
    }
  }

}
